package cn.lg.soar.system.biz.modules.auth.service;

import cn.lg.soar.common.util.current.CurrentProxy;
import cn.lg.soar.common.util.data.DataUtil;
import cn.lg.soar.common.util.data.TreeUtil;
import cn.lg.soar.database.base.service.ITreeService;
import cn.lg.soar.system.biz.modules.auth.entity.Org;
import cn.lg.soar.system.biz.modules.auth.model.OrgDto;
import cn.lg.soar.system.biz.modules.auth.model.OrgTree;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author luguoxiang
 * @date 2021/8/21
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IOrgService extends ITreeService<Long, Org>, CurrentProxy<IOrgService> {

    /**
     * 获取祖先列表(包含自己)
     * @param id
     * @return
     */
    List<Org> getAncestorById(Long id);

    /**
     * 获取祖先列表(包含自己)
     * @param ids
     * @return
     */
    List<List<Org>> getAncestorListByIds(Collection<Long> ids);

    Long create(OrgDto data);

    List<Org> listByUserId(Long userId);

    /**
     * 清空缓存
     */
    void clearCache();

    /**
     * 获取子孙ids
     * @param orgIds
     * @return
     */
    List<Long> getInferiorsIds(Collection<Long> orgIds);

    /**
     * 获取子孙ids
     * @param orgIds
     * @return
     */
    default List<Long> getInferiorsIds(Long...orgIds) {
        return getInferiorsIds(DataUtil.arrayToList(orgIds));
    }

    /**
     * 根据id获取名称链路
     * @param ids
     * @return
     */
    Map<Long, List<String>> nameLinkByIds(Collection<Long> ids);

    /**
     * 获取树数据
     * @return
     */
    List<OrgTree> tree();

    /**
     * 获取树数据
     * @param parentId 父id，可为空
     * @return
     */
    default List<OrgTree> tree(Long parentId) {
        List<OrgTree> tree = proxy().tree();
        if (parentId == null || parentId.equals(0L)) {
            return tree;
        }
        List<OrgTree> res = new ArrayList<>();
        TreeUtil.forEach(tree, (x) -> {
            if (parentId.equals(x.getId()) && DataUtil.isValuable(x.getChildren())) {
                res.addAll(x.getChildren());
            }
        });
        return res;
    }

}
